// 封装axios（前端请求方式为ajax的axios.js库）
// 第一步导入
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
import { getTimeStamp, removeTimeStamp } from '@/utils/auth'
// 第二步创建副本对象
const instance = axios.create({
  // 注释掉即可解决跨域问题
  // baseURL: 'http://localhost:3000'
})
// 过期时间 30分钟
const timeOut = 30 * 60 * 1000
// 测试时间
// const timeOut = 10 * 1000
// 第三步 设置拦截器
// 请求拦截器  
instance.interceptors.request.use(
  config => {
    // 得到当前时间与token保存时间之间的间隔
    // 得到token的保存时间
    const tokenTime = getTimeStamp()
    const space = Date.now() - tokenTime
    // 判断时间间隔是否超过过期时间
    if (space >= timeOut) {
      // 已经过期
      // 退出登录、跳转到登录页面
      store.commit('user/removeToken')
      // 删除token存储的时间，重新计数，防止处bug
      removeTimeStamp()
      router.push('/login')
      // 提醒用户
      Message.error('token过期')
      return Promise.reject(new Error('token 过期了'))
    }

    // 相当一部分的请求在发送的时候需要token
    // 所以在这里统一加token
    // 全局变量中取出token
    const token = store.getters.token
    // 判断token是否存在
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 响应拦截器
instance.interceptors.response.use(response => {
  // response中其实包含了服务器响应回来的内容，包含在data中
  // 处理参数出错(例如账密不对,服务器报错,前端如何给用户和流程上处理捏?)
  const { data, message, success } = response.data
  console.log(22)
  if (success) {
    // 因为解构了，可以直接返回data就可以
    console.log(666)
    return response.data
  } else {
    // 如果账密有问题，在此处理
    console.log(message)
    // 返回一个错误对象，用来处理，会触发.catch()
    return Promise.reject(new Error(message))
  }
}, error => {
  // 接收状态码
  // 满足以上三个条件表明token失效
  if (error.response && error.response.data && error.response.data.code === 10002) {
    // 删除失效token
    store.commit('user/removeToken')
    // 清除token保存时间
    // 跳转到登录页面 
    router.push('/login')
    // 提示错误信息
    Message.error('token失效了')
  }
  return Promise.reject(error)
})
// 暴露给其他文件调用
export default instance
